import { query } from "./utils/index.js";
import { initState } from "./state.js";
import { mountComponent } from "./lifecycle";
import { compileToFunctions } from "./compiler/index.js";
export function initMixin(Vue) {
  Vue.prototype._init = function (options) {
    // 保存this
    const vm = this;
    // 将配置挂载到实例上
    vm.$options = options;
    // 初始化状态
    initState(vm); // 处理data

    // 编译相关
    // 如果用户定义了el 挂载函数
    if (vm.$options.el) {
      vm.$mount(vm.$options.el);
    }
  };

  Vue.prototype.$mount = function (el) {
    // 保存this
    const vm = this;
    // 保存配置
    const options = vm.$options;
    //el存在执行query
    el = el && query(el);
    vm.$el = el
    // 渲染顺序
    // 默认先查找render方法
    if (!options.render) {
      // 没有render 采用template 对模版进行编译
      let template = options.template;
      // 存在template
      if (template) {
        // 将template转为render方法
        // 不存在template 使用el中的内容
      } else if (el) {
        template = el.outerHTML;
      }
      // compileToFunctions 编译成ast树 将ast树编译成虚拟节点
      const render = compileToFunctions(template);
      options.render = render;
    }
    mountComponent(vm);
  };
}
